package com.demo.tankGame05;

import java.util.Vector;

/**
 * 绘制敌人的坦克
 *
 * @author gy
 * @date 2022/4/20
 */
public class EnemyTank extends Tank implements Runnable {

    Vector<Shot> shots = new Vector<>();

    /**
     * 增加成员，EnemyTank 可以得到敌人坦克的Vector
     */
    Vector<EnemyTank> enemyTanks = new Vector<>();

    boolean isLive = true;

    public EnemyTank(int x, int y) {
        super(x, y);
    }

    /**
     * 面向对象的一种思想：
     * 这里提供一个方法，可以将MyPanel 的成员 Vector<EnemyTank> enemyTanks = new Vector<>();
     * 设置到 EnemyTank 的 成员 enemyTanks
     *
     * @param enemyTanks
     */
    public void setEnemyTanks(Vector<EnemyTank> enemyTanks) {
        this.enemyTanks = enemyTanks;
    }

    /**
     * 编写方法，判断当前的这个敌人坦克，是否和 enemyTanks 中的其他坦克发生了重叠或者碰撞
     */
    public boolean isTouchEnemyTank() {

        switch (this.getDirect()) {
            case 0:
                for (int i = 0; i < enemyTanks.size(); i++) {
                    // 从vector 中取出一个敌人坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    // 不和自己进行比较
                    if (enemyTank != this) {
                        // 如果敌人坦克是上/下
                        /**
                         * 思路分析：
                         * 敌人坦克的 x范围 【enemyTank.getX(), enemyTank.getX() + 40】
                         * y范围 【enemyTank.getY() , enemyTank.getY() + 60】
                         */
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2) {
                            // 当前坦克 左上角的坐标【this.getX() , this.getY()】
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60) {
                                return true;
                            }
                            // 当前坦克 右上角的坐标【this.getX() + 40 , this.getY()】
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60) {
                                return true;
                            }
                        }
                        // 如果敌人坦克是左/右
                        /**
                         * 思路分析：
                         * 敌人坦克的 x范围 【enemyTank.getX(), enemyTank.getX() + 60】
                         * y范围 【enemyTank.getY() , enemyTank.getY() + 40】
                         */
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3) {
                            // 当前坦克 左上角的坐标【this.getX() , this.getY()】
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 40) {
                                return true;
                            }
                            // 当前坦克 右上角的坐标【this.getX() + 40 , this.getY()】
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 40) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 1:
                for (int i = 0; i < enemyTanks.size(); i++) {
                    // 从vector 中取出一个敌人坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    // 不和自己进行比较
                    if (enemyTank != this) {
                        // 如果敌人坦克是上/下
                        /**
                         * 思路分析：
                         * 敌人坦克的 x范围 【enemyTank.getX(), enemyTank.getX() + 40】
                         * y范围 【enemyTank.getY() , enemyTank.getY() + 60】
                         */
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2) {
                            // 当前坦克 右上角的坐标【this.getX() + 60 , this.getY()】
                            if (this.getX() + 60  >= enemyTank.getX()
                                    && this.getX() + 60  <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60) {
                                return true;
                            }
                            // 当前坦克 右下角的坐标【this.getX() + 60 , this.getY() + 40】
                            if (this.getX() + 60 >= enemyTank.getX()
                                    && this.getX() + 60 <= enemyTank.getX() + 40
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 60) {
                                return true;
                            }
                        }
                        // 如果敌人坦克是左/右
                        /**
                         * 思路分析：
                         * 敌人坦克的 x范围 【enemyTank.getX(), enemyTank.getX() + 60】
                         * y范围 【enemyTank.getY() , enemyTank.getY() + 40】
                         */
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3) {
                            // 当前坦克 右上角的坐标【this.getX() + 60 , this.getY()】
                            if (this.getX() + 60 >= enemyTank.getX()
                                    && this.getX() + 60 <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 40) {
                                return true;
                            }
                            // 当前坦克 右下角的坐标【this.getX() + 60 , this.getY() + 40】
                            if (this.getX() + 60 >= enemyTank.getX()
                                    && this.getX() + 60 <= enemyTank.getX() + 60
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 40) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 2:
                for (int i = 0; i < enemyTanks.size(); i++) {
                    // 从vector 中取出一个敌人坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    // 不和自己进行比较
                    if (enemyTank != this) {
                        // 如果敌人坦克是上/下
                        /**
                         * 思路分析：
                         * 敌人坦克的 x范围 【enemyTank.getX(), enemyTank.getX() + 40】
                         * y范围 【enemyTank.getY() , enemyTank.getY() + 60】
                         */
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2) {
                            // 当前坦克 左下角的坐标【this.getX()  , this.getY() + 60】
                            if (this.getX()   >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 40
                                    && this.getY()+ 60   >= enemyTank.getY()
                                    && this.getY()+ 60   <= enemyTank.getY() + 60) {
                                return true;
                            }
                            // 当前坦克 右下角的坐标【this.getX() + 40 , this.getY() + 60】
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 40
                                    && this.getY() + 60 >= enemyTank.getY()
                                    && this.getY() + 60 <= enemyTank.getY() + 60) {
                                return true;
                            }
                        }
                        // 如果敌人坦克是左/右
                        /**
                         * 思路分析：
                         * 敌人坦克的 x范围 【enemyTank.getX(), enemyTank.getX() + 60】
                         * y范围 【enemyTank.getY() , enemyTank.getY() + 40】
                         */
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3) {
                            // 当前坦克 左下角的坐标【this.getX()  , this.getY() + 60】
                            if (this.getX()  >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() + 60  >= enemyTank.getY()
                                    && this.getY() + 60 <= enemyTank.getY() + 40) {
                                return true;
                            }
                            // 当前坦克 右下角的坐标【this.getX() + 40 , this.getY() + 60】
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 60
                                    && this.getY() + 60 >= enemyTank.getY()
                                    && this.getY() + 60 <= enemyTank.getY() + 40) {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 3:
                for (int i = 0; i < enemyTanks.size(); i++) {
                    // 从vector 中取出一个敌人坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    // 不和自己进行比较
                    if (enemyTank != this) {
                        // 如果敌人坦克是上/下
                        /**
                         * 思路分析：
                         * 敌人坦克的 x范围 【enemyTank.getX(), enemyTank.getX() + 40】
                         * y范围 【enemyTank.getY() , enemyTank.getY() + 60】
                         */
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2) {
                            // 当前坦克 左上角的坐标【this.getX()  , this.getY()】
                            if (this.getX()   >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60) {
                                return true;
                            }
                            // 当前坦克 左下角的坐标【this.getX() , this.getY() + 40】
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX()  <= enemyTank.getX() + 40
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 60) {
                                return true;
                            }
                        }
                        // 如果敌人坦克是左/右
                        /**
                         * 思路分析：
                         * 敌人坦克的 x范围 【enemyTank.getX(), enemyTank.getX() + 60】
                         * y范围 【enemyTank.getY() , enemyTank.getY() + 40】
                         */
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3) {
                            // 当前坦克 左上角的坐标【this.getX()  , this.getY()】
                            if (this.getX()  >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 60
                                    && this.getY()  >= enemyTank.getY()
                                    && this.getY()<= enemyTank.getY() + 40) {
                                return true;
                            }
                            // 当前坦克 左下角的坐标【this.getX() , this.getY() + 40】
                            if (this.getX()>= enemyTank.getX()
                                    && this.getX()  <= enemyTank.getX() + 60
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 40) {
                                return true;
                            }
                        }
                    }
                }
                break;
            default:
        }
        // 整个都没有进入switch中，返回没有碰撞
        return false;
    }

    @Override
    public void run() {
        while (true) {
            Shot s = null;
            if (isLive && shots.size() < 10) {
                switch (getDirect()) {
                    case 0:
                        s = new Shot(getX() + 20, getY(), 0);
                        break;
                    case 1:
                        s = new Shot(getX() + 60, getY() + 20, 1);
                        break;
                    case 2:
                        s = new Shot(getX() + 20, getY() + 60, 2);
                        break;
                    case 3:
                        s = new Shot(getX(), getY() + 20, 3);
                        break;
                    default:
                }
                shots.add(s);
                // 启动敌人子弹
                new Thread(s).start();
            }
            switch (getDirect()) {
                case 0:
                    // 为了让敌人的坦克 沿着一个方向移动一定的距离
                    for (int i = 0; i < 30; i++) {
                        //关键 同时要判断是否碰撞了
                        if (getY() > 0 && !isTouchEnemyTank()) {
                            moveUp();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 1:
                    for (int i = 0; i < 30; i++) {
                        if (getX() + 60 < 1000 && !isTouchEnemyTank()) {
                            moveRight();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 2:
                    for (int i = 0; i < 30; i++) {
                        if (getY() + 60 < 750 && !isTouchEnemyTank()) {
                            moveDown();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 3:
                    for (int i = 0; i < 30; i++) {
                        if (getX() > 0 && !isTouchEnemyTank()) {
                            moveLeft();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                default:
            }
            // 随机修改坦克的方向值 0-3
            setDirect((int) (Math.random() * 4));
            // 在创建并发程序时，一定要考虑，线程什么时候结束
            if (!isLive) {
                break;
            }
        }
    }
}
